home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
autopark.zip
/
AUTOPARK.ASM
next >
Wrap
Assembly Source File
|
1986-05-03
|
22KB
|
447 lines
PAGE 66,132
VECTORS SEGMENT AT 0H
ORG 8H*4
TOD_VECTOR LABEL DWORD ; CLOCK INTERRUPT
ORG 13H*4
DISK_VECTOR LABEL DWORD ; HARD DISK BIOS CALL
VECTORS ENDS
;
; THIS IS THE START OF THE LOCAL DATA AND EXECUTABLE CODE
;
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG
ORG 100H
BEGIN: CALL PARK ; FIND OUT WHERE TO PARK
JMP INIT_VECTORS ;INITIALIZE VECTORS & ATTACH TO DOS
ROM_TOD_INT DD ? ; ADDRESSES FOR ROM ROUTINES
ROM_DISK_INT DD ?
TIMER_DELAY DW 546 ; DELAY BEFORE PARKING HEAD
DELAY DW ? ; CLOCK TICKS DURING DELAY
BUSY DB 0
CYLNUM0 DW 0
CYLNUM1 DW 0
;
; PARK THE HARD DISK HEAD AFTER DELAY WITHOUT USE
;
;
OUR_TOD_INT PROC NEAR
PUSHF
CALL ROM_TOD_INT ; GO TO OTHER CODE FIRST
PUSH AX
PUSH DS
MOV AX,CS ; SET DATA SEGMENT TO OURSELF
MOV DS,AX
ASSUME DS:CODE_SEG
DEC DELAY ; HAS DELAY ELAPSED?
JZ PARK_IT ; YUP
JG COUNT_DOWN ; NOPE
MOV DELAY,0 ; HEAD IS PARKED, RESET COUNTER TO 0
COUNT_DOWN: POP DS
POP AX
ASSUME DS:NOTHING
IRET
PARK_IT: ASSUME DS:CODE_SEG
PUSH AX
PUSH BX
PUSH CX
PUSH DX
TEST BUSY,80H ; IS DISK CODE BUSY?
JNZ IT_IS_BUSY ; OOPS, YES
CMP CYLNUM0,0 ; IS THERE A DISK 0?
JE NODISK0 ; NOPE
MOV AH,0CH ; SEEK
MOV AL,1 ; GOTTA HAVE A SECTOR COUNT
MOV DL,80H ; DRIVE 0
MOV DH,0 ; GOTTA HAVE A HEAD NUMBER
MOV CX,CYLNUM0 ; GET CYL NUMBER
XCHG CL,CH ; PUT LO ORDER IN CH
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
INC CL ; NOW SAY SECTOR 1
PUSHF
CALL ROM_DISK_INT ; MUST USE CALL SINCE INT 13H > HERE
NODISK0:
CMP CYLNUM1,0 ; IS THERE A DISK 1?
JE NODISK1 ; NO
MOV AH,0CH ; SEEK
MOV AL,1 ; GOTTA HAVE A SECTOR COUNT
MOV DL,81H ; DRIVE 1
MOV DH,0 ; GOTTA HAVE A HEAD NUMBER
MOV CX,CYLNUM1 ; GET CYL NUMBER
XCHG CL,CH ; PUT LO ORDER IN CH
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
SAL CL,1 ; PUT HI IN TOP OF CL
INC CL ; NOW SAY SECTOR 1
PUSHF
CALL ROM_DISK_INT ; MUST USE CALL SINCE INT 13H > HERE
NODISK1:
POP DX
POP CX
POP BX
POP AX
JMP COUNT_DOWN
IT_IS_BUSY: CALL RESET ; DISK IS BUSY, WAIT ANOTHER 5 SEC
POP DX
POP CX
POP BX
POP AX
JMP COUNT_DOWN
OUR_TOD_INT ENDP
;
; THIS PROCEDURE RESETS THE TIMER COUNT TO ITS INITIAL VALUE
;
RESET PROC NEAR
PUSH AX
PUSH DS
MOV AX,CS
MOV DS,AX
ASSUME DS:CODE_SEG
MOV AX,TIMER_DELAY
MOV DELAY,AX
POP DS
POP AX
RET
RESET ENDP
;
;
; THIS PROCEDURE RESETS THE TIME-OUT COUNTER AND PASSES CONTROL
; TO THE BIOS DISK ROUTINES
;
CATCH_DISK PROC FAR
ASSUME DS:NOTHING
OR BUSY,80H ; MARK DISK BUSY
TEST DL,80H ; IS IT A HARD DISK CALL?
JZ NORESET ; NO
CALL RESET ; RESET THE TIME-OUT COUNTER
NORESET: PUSHF ; SIMULATE INTERRUPT
CALL ROM_DISK_INT ; DO BIOS STUFF
PUSHF ; REMEMBER FLAGS FROM DISK ROUTINE
AND BUSY,7FH ; MARK DISK NOT BUSY
POPF ; REMEMBER FLAGS FROM DISK ROUTINE
RET 2 ; THROW AWAY USER'S SAVED FLAGS
CATCH_DISK ENDP
;
; THIS PROCEDURE INITIALIZES THE INTERRUPT VECTORS
;
INIT_VECTORS PROC NEAR
ASSUME DS:VECTORS
MOV AX,VECTORS ; SET UP DATA SEGMENT FOR VECTORS
MOV DS,AX
CLI
MOV AX,WORD PTR TOD_VECTOR ; SAVE ADDRESSES OF BIOS ROUTINES
MOV WORD PTR ROM_TOD_INT,AX
MOV AX,WORD PTR TOD_VECTOR[2]
MOV WORD PTR ROM_TOD_INT[2],AX
MOV WORD PTR TOD_VECTOR,OFFSET OUR_TOD_INT
MOV WORD PTR TOD_VECTOR[2],CS
MOV AX,WORD PTR DISK_VECTOR
MOV WORD PTR ROM_DISK_INT,AX
MOV AX,WORD PTR DISK_VECTOR[2]
MOV WORD PTR ROM_DISK_INT[2],AX
MOV WORD PTR DISK_VECTOR,OFFSET CATCH_DISK
MOV WORD PTR DISK_VECTOR[2],CS
MOV AX,TIMER_DELAY ; SET DELAY TO STARTING COUNT
MOV DELAY,AX
STI ; ALLOW INTERRUPTS AGAIN
MOV DX,OFFSET INIT_VECTORS ; END OF RESIDENT PORTION
INT 27H ; TERMINATE BUT STAY RESIDENT
INIT_VECTORS ENDP
SUBTTL PARK -- PARK THE HEADS IN ORDER TO FIND OUT WHERE TO PARK
PAGE
PARK PROC
PUSH AX
PUSH CX
PUSH DX
PUSH ES
;
; MOVE DRIVE 0 AS FAR AS POSSIBLE IN STEPS OF 100 TRACKS
;
SEEK0100: MOV AH,0CH ; SEEK
MOV AL,1 ; GOTTA HAVE A SECTOR COUNT
MOV DL,80H ; DRIVE 0
MOV DH,0 ; GOTTA HAVE A HEAD NUMBER
MOV CX,CYLNUM0 ; GET CYLINDER NUMBER
ADD CX,100 ; INCREMENT BY 100
MOV CYLNUM0,CX ;